package com.jinzhi.wxpay.util;

import com.alibaba.fastjson.JSONObject;
import com.jinzhi.wxpay.config.WxPayConfigZF;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.security.Signature;
import java.util.Base64;

/**
 * 小程序端获取用户的openid
 * */
public class GetOpenIdUtil {





    public String getopenid(String appid, String code, String secret) {//appid：appid  ，secret：apiV3Key
        BufferedReader in = null;
        //appid和secret是开发者分别是小程序ID和小程序密钥，开发者通过微信公众平台-》设置-》开发设置就可以直接获取，
        String url="https://api.weixin.qq.com/sns/jscode2session?appid="
                +appid+"&secret="+secret+"&js_code="+code+"&grant_type=authorization_code";
        try{
            URL weChatUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection connection = weChatUrl.openConnection();
            // 设置通用的请求属性
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(5000);
            // 建立实际的连接
            connection.connect();
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            StringBuffer sb = new StringBuffer();
            String line;
            while ((line = in.readLine()) != null) {
                sb.append(line);
            }
            return sb.toString();
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }

    //通过code获取openid
    public static String decodeUserInfo(String appid, String code, String secret) {
        GetOpenIdUtil getOpenIdUtil=new GetOpenIdUtil();
        String jsonId = getOpenIdUtil.getopenid(appid,code,secret);
        System.out.println("jsonId=====>"+jsonId);
        JSONObject jsonObject = JSONObject.parseObject(jsonId);
        //可将返回值类型改为String，然后直接return jsonObject
        String openid=jsonObject.getString("openid");
        return openid;
    }



    //支付签名值paySing计算
    /**
     * 作用：使用字段appId、timeStamp、nonceStr、package计算得出的签名值
     * 场景：根据微信统一下单接口返回的 prepay_id 生成调启支付所需的签名值
     * @param appId
     * @param timestamp
     * @param nonceStr
     * @param pack package
     * @return
     * @throws Exception
     */
    public static String getSign(String appId, long timestamp, String nonceStr, String pack) throws Exception{
        String message = buildMessage(appId, timestamp, nonceStr, pack);
        String paySign= sign(message.getBytes("utf-8"));
        return paySign;
    }

    private static String buildMessage(String appId, long timestamp, String nonceStr, String pack) {
        return appId + "\n"
                + timestamp + "\n"
                + nonceStr + "\n"
                + pack + "\n";
    }
    private static String sign(byte[] message) throws Exception{
        Signature sign = Signature.getInstance("SHA256withRSA");
        WxPayConfigZF wxPayConfigZF = new WxPayConfigZF();
        System.out.println("私钥文件："+"/apiclient_key.pem");
        //这里需要一个PrivateKey类型的参数，就是商户的私钥。
        sign.initSign(wxPayConfigZF.getPrivateKey("/apiclient_key.pem"));
        sign.update(message);
        return Base64.getEncoder().encodeToString(sign.sign());
    }




}
